package cn.xpp011.distributedlocksdemo.annotation.locks;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 分布式锁注解类
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DistributedLock {

    /**
     * 锁的key
     * @return
     */
    String value() default "";

    /**
     * key的前缀
     * @return
     */
    String prefix() default "";

    /**
     * 参数是否参与锁的构建
     * 底层使用参数的hashcode构建key，注意重写参数hash方法
     * @return
     */
    boolean paramLock() default false;

    /**
     * 锁的超时时间,单位毫秒
     * @return
     */
    long keyTimeout() default 1000L;

    /**
     * 最大重试次数
     * 0 : 表示该方法一定要拿到锁并执行，如果一直获取不到锁会死循环
     * @return
     */
    int retryCount() default 3;

    /**
     * 重试间隔时间,单位毫秒
     * @return
     */
    long retryInterval() default 500L;
}
